import argparse
import os
import shutil
import hashlib

# 定义一些辅助函数
def ADD(file_name):
    # 确保暂存区目录存在
    stage_path = os.path.join('.git','Stage')
    if not os.path.exists(stage_path):
        print('检测不到暂存区，请检查是否已经初始化仓库')
        return 

    # 检查文件是否存在
    if not os.path.exists(file_name):
        print(f"文件 {file_name} 不存在。")
        return

    # 复制文件到暂存区
    shutil.copy(file_name,stage_path)
    print(f"文件 {file_name} 已加入暂存区")
    
def INIT() :
    #在当前文件夹中新建.git文件夹
    #.git里面有一个暂存区文件夹Stage和一个版本库文件夹Repository
    
    #新建文件夹.git
    name = '.git'
    os.makedirs( name , exist_ok = True )
    
    #新建文件夹Stage
    stage_name = os.path.join( name , 'Stage' )
    os.makedirs( stage_name , exist_ok = True )
    
    #新建文件夹Repository
    repo_name = os.path.join( name , 'Repository' )
    os.makedirs( repo_name , exist_ok = True )
    
def COMMIT(filepath):
    source_path = os.path.join(".git","Stage", filepath)
    target_path = os.path.join(".git","Repository", filepath)

    if not os.path.exists(source_path):
        print(f"错误：文件 {filepath} 不存在于暂存区。")
        return

    shutil.move(source_path, target_path)
    print(f"文件 {filepath} 成功提交到版本库。")

def compare( file1 , file2 ) :
    with open(file1,'rb') as f1,open(file2,'rb') as f2 :
        content1 = f1.read()
        content2 = f2.read()
    
    if content1 == content2 :
        return True
    return False

def get_file_status(file_path):
    # 根据相对位置获取文件在版本库中的路径（因为没有具体的文件信息所以先草拟了几个版本库我设定的相对位置为.git\Staged, .git\Committed, .git\Modified）
    staged_path = os.path.join('.git', 'Stage', file_path)
    committed_path = os.path.join('.git', 'Repository', file_path)
    modified_path = file_path

    # 先检查Staged文件夹中是否有相同文件
    if os.path.exists(staged_path):
        #先检查是否修改过
        if compare(file_path,staged_path) :
            return "Modified"
        return "Staged"

    # 再检查Committed文件夹中是否有相同文件
    if os.path.exists(committed_path):
        if compare(file_path,committed_path) :
            return "Modified"
        return "Committed"

    # 既不在暂存区也不在版本库，文件未跟踪
    return "Untracked"

def STATUS(directory):
    for root, dirs, files in os.walk(directory):
        if ".git" in dirs :
            dirs.remove(".git")
        for file in files:
            file_path = os.path.join(root, file)
            status = get_file_status(file_path)
            print(f"{file_path}: {status}")
parser = argparse.ArgumentParser()

parser.add_argument('-i','--init',action="store_true",help="初始化git仓库")
parser.add_argument('-a','--add',type=str,help="将文件夹中文件加入暂存区")
parser.add_argument('-c','--commit',type=str,help="将暂存区中的文件提交到版本库")
parser.add_argument('-s',"--status",action='store_true',help="显示所有文件状态")



args = parser.parse_args()

if args.init :
    INIT()

if args.add :
    ADD(args.add)
    
if args.commit :
    COMMIT(args.commit)
    
if args.status :
    STATUS('.')